/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tpobjetos;

import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author santiago
 */
public class AutorDAO {
//nos servirán para mantener la referencia a la sesión a base de datos, y a la transacción actual
private Session sesion;
private Transaction tx;

//ayudará a iniciar una sesión y una transacción en la base de datos

private void iniciaOperacion() throws HibernateException{
    sesion = HibernateUtil.getSessionFactory().openSession();
    tx = sesion.beginTransaction();
}

//maneja la excepcion que surja si hay problemas con el inicio de la transaccion
private void manejaExcepcion(HibernateException he) throws HibernateException{
    tx.rollback();
    throw new HibernateException("Ocurrió un error en la capa de acceso a datos", he);
}

//Hibernate proporciona el método "save" en el objeto de tipo "org.hibernate.Session", 
//que se encarga de generar el "INSERT" apropiado para la entidad que estamos tratando de guardar
public long guardaAutor(Autor autor){ 
    long id = 0;  
    try { 
        iniciaOperacion(); 
        id = (Long)sesion.save(autor); 
        tx.commit(); 
    }catch(HibernateException he) { 
        manejaExcepcion(he);
        throw he; 
    }finally { 
        sesion.close(); 
    }  
    return id; 
}


public void actualizaAutor(Autor autor) throws HibernateException { 
    try { 
        iniciaOperacion(); 
        sesion.update(autor); 
        tx.commit(); 
    }catch (HibernateException he){ 
        manejaExcepcion(he); 
        throw he; 
    }finally { 
        sesion.close(); 
    } 
}

public void eliminaAutor(Autor autor) throws HibernateException { 
    try { 
        iniciaOperacion(); 
        sesion.delete(autor); 
        tx.commit(); 
    } catch (HibernateException he){ 
        manejaExcepcion(he); 
        throw he; 
    }finally { 
        sesion.close(); 
    } 
}


//retorna el auto que tenga ese id
public Autor obtenAutor(long idAutor) throws HibernateException{ 
    Autor autor = null;  
    try { 
        iniciaOperacion(); 
        autor = (Autor) sesion.get(Autor.class, idAutor);//get retorna NULL si no encuentra nada 
    } finally { 
        sesion.close(); 
    }  
    return autor; 
}

//recupera todos los Contactos que estén guardados en la base de datos
//Creamos una query en HQL 
//recuerden que en base al nombre de la clase Hibernate sabrá en cuál tabla están almacenadas las entidades
public List<Autor> obtenListaAutores() throws HibernateException { 
    List<Autor> listaAutores = null;  
    try { 
        iniciaOperacion(); 
        listaAutores = sesion.createQuery("from Autor").list(); 
    }finally{ 
        sesion.close(); 
    }  
    return listaAutores; 
}

}
